package com.carb.aspect;

import com.carb.annotation.RequiredRoles;
import com.carb.constant.MessageConstant;
import com.carb.context.UserContext;
import com.carb.exception.IllegalAuthorityException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 权限校验切面
 */
@Aspect
@Component
@Slf4j
public class AuthorityAspect {

    /**
     * 切点：所有带有@RequireRoles注解的方法
     */
    @Pointcut("@annotation(com.carb.annotation.RequiredRoles)")
    public void pointcut() {}

    /**
     * 权限校验（环绕通知）
     * @param joinPoint 切点
     */
    @Before("pointcut()")
    public void checkPermission(JoinPoint joinPoint) {
        // 1、获取当前登录用户的用户角色
        String currentUserRole = UserContext.getUserRole();

        // 2、获取注解中配置的角色
        MethodSignature signature = (MethodSignature) joinPoint.getSignature(); // 方法签名对象
        String[] requireRoles = signature.getMethod().getAnnotation(RequiredRoles.class).value();
        log.info("用户权限校验，需要的权限为：{}", (Object) requireRoles);

        // 3、校验用户角色是否匹配
        // 3.1、注解中配置的角色为空，则直接放行
        if (requireRoles.length == 0) return;
        // 3.2、不为空，用户角色不匹配，则抛出非法权限异常
        if (!Arrays.asList(requireRoles).contains(currentUserRole)) {
            log.warn("用户用户权限不足！");
            throw new IllegalAuthorityException(MessageConstant.NO_PERMISSION);
        }

        // 4、校验通过
        log.info("用户权限校验通过！");
    }

}
